package com.lml.jdk8.localdate.java8Time;

import org.junit.jupiter.api.Test;

import java.time.*;
import java.time.temporal.ChronoUnit;

/**
 * @author luomingliang
 * @date 2021/9/9 23:33
 */
public class Java8TimeMethodPlusDemo {
    /**
     * 演示LocalDate的plus方法。minus方法同理（这里不再演示）
     */
    @Test
    public void test01() {
        //封装LocalDate对象参数为2016年2月13日。
        LocalDate localDate = LocalDate.of(2016, 2, 13);
        System.out.println("当前时间为：" + localDate);

        //计算当前时间的4天后的时间并打印
        LocalDate after4Days = localDate.plusDays(4);
        //计算时间后返回的LocalDate对象是一个新值，并不是原来对象
        System.out.println(localDate == after4Days);
        System.out.println("当前时间的4天后的时间是：" + after4Days);

        //计算当前时间的3周后的时间并打印
        LocalDate after3Weeks = localDate.plusWeeks(3);
        System.out.println("当前时间的3周后的时间是：" + after3Weeks);

        //计算当前时间的5个月后的时间并打印
        LocalDate after5Months = localDate.plusMonths(5);
        System.out.println("当前时间的5个月后的时间是：" + after5Months);

        //计算当前时间的2年后的时间并打印
        LocalDate after2Years = localDate.plusYears(2);
        System.out.println("当前时间的2年后的时间是：" + after2Years);
    }

    /**
     * 演示LocalTime的plus方法。minus方法同理（这里不再演示）
     */
    @Test
    public void test02() {
        //封装LocalTime对象参数为8点14分39秒218纳秒。
        LocalTime localTime = LocalTime.of(8, 14, 39, 218);
        System.out.println("当前时间为：" + localTime);

        //计算当前时间的500纳秒后的时间并打印
        LocalTime after500Nanos = localTime.plusNanos(500);
        //计算时间后返回的LocalDate对象是一个新值，并不是原来对象
        System.out.println(localTime == after500Nanos);
        System.out.println("当前时间的500纳秒后的时间是：" + after500Nanos);

        //计算当前时间的45秒后的时间并打印
        LocalTime after45Seconds = localTime.plusSeconds(45);
        System.out.println("当前时间的45秒后的时间是：" + after45Seconds);

        //计算当前时间的19分钟后的时间并打印
        LocalTime after19Minutes = localTime.plusMinutes(19);
        System.out.println("当前时间的19分钟后的时间是：" + after19Minutes);

        //计算当前时间的3小时后的时间并打印
        LocalTime after3Hours = localTime.plusHours(3);
        System.out.println("当前时间的3小时后的时间是：" + after3Hours);
    }

    /**
     * 演示plus(TemporalAmount amountToAdd)方法的使用
     * 需求：今天程序员小张查看自己的车辆保险记录的时候看到还有2年3月8天就到期了，计算到期的时间是什么时候
     */
    @Test
    public void test03() {
        //1.封装当前时间 -> now方法
        LocalDateTime now = LocalDateTime.now();
        //2.在当前时间的基础上，进行+2年，+3月，+8天的操作，然后获得一个截止日期对象，这个对象表示的时间就是保险到期的时间
//        LocalDateTime endTime = now.plusYears(2).plusMonths(3).plusDays(8);

        /*
        Period.of(int years, int months, int days) -> 表示一段时间
         */
        Period period = Period.of(2, 3, 8);
        LocalDateTime endTime = now.plus(period);
        System.out.println("保险记录到期时间为：" + endTime);
    }

    /**
     * 演示
     * 结婚10年成为锡婚，2020年2月2日11点11分11秒成为对称日，很多情侣准备在那天结婚，如果那天结婚了，那么锡婚会发生在什么时候？
     */
    @Test
    public void test04() {
        //封装日期 -> 表示结婚的时间点
        LocalDateTime marryTime = LocalDateTime.of(2020, 2, 2, 11, 11, 11);
        //使用plus方法进行计算，加1个10年
        LocalDateTime time = marryTime.plus(1, ChronoUnit.DECADES);
        System.out.println("如果在" + marryTime + "结婚，那么锡婚的时间是：" + time);

        //如果锡婚后的半天需要请亲戚朋友吃饭，那么计算吃饭的时间点
        LocalDateTime eatTime = time.plus(1, ChronoUnit.HALF_DAYS);
        System.out.println("半天后请亲戚朋友吃饭的时间点是：" + eatTime);
    }

    @Test
    public void test05() {
        YearMonth of = YearMonth.of(2021, 12);
        YearMonth nextYear = YearMonth.of(2022, 1);
        YearMonth copyYearMonth = of;

        copyYearMonth = copyYearMonth.plusMonths(1);
        System.out.println("of = " + of);
        System.out.println("copyYearMonth = " + copyYearMonth);

        long between = ChronoUnit.YEARS.between(of, nextYear);
        System.out.println(between);
    }
}
